#include "raid.h"
#include <pthread.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#include "Sockets.h"
#include "funcionesSelect.h"
#define MAX_CLIENTES 10
#define LOGPATH "Log.txt"
int main() {
	//variables select

	log =  log_create("Runner", LOGPATH, ERROR | DEBUG | INFO | WARNING, M_CONSOLE_DISABLE);

	punteroFteSelect=NULL;
	punteroFinSelect=NULL;

	//INICIALIZACION DE MUTEX
	pthread_mutex_init(&mutexSincro, NULL);
	pthread_mutex_init(&mutexFinalizar, NULL);
	pthread_mutex_init(&mutexArchConfig, NULL);
	pthread_mutex_init(&mutexSecTot, NULL);
	pthread_mutex_init(&mutexPtroSelectAux, NULL);
	pthread_mutex_init(&mutexPtroFte, NULL);
	pthread_mutex_init(&mutexPtroFteEsc, NULL);
	pthread_mutex_init(&mutexPtroFteEscritura, NULL);
	pthread_mutex_init(&mutexDescriptor, NULL);
	pthread_mutex_init(&mutexPtroFteSelectAux, NULL);
	pthread_mutex_init(&mutexPtroFinEsc, NULL);

	pthread_mutex_init(&mutexPtroBackup, NULL);
	pthread_mutex_init(&mutexDescriptorASincronizar, NULL);

	pthread_mutex_init(&mutexPtroLectura,NULL);
	consola_RAIDenFuncionamiento();
	//CARGO DATOS DEL ARCHIVO DE CONFIGURACION
	pthread_mutex_lock(&mutexArchConfig);

	if (iniciarEstructuraConfiguracion()!=1) {
		printf("No se pudo procesar el archivo de configuracion");
		return 1;
	}
	printf("El archivo de configuracion arrojo estos resultados:\n");
	printf("\tConexion Proceso File System y Disco= %d\n",stConfig.puertoFSyPPD);
	printf("\tIp donde se levanto= %s\n",stConfig.ipRaid);
	printf("\tActivar Consola= %s\n",stConfig.activarConsola);
	pthread_mutex_unlock(&mutexArchConfig);


		//variables hilos
	int32_t valorRetornoHilo;
	//CREO HILO QUE ATIENDE CONEXIONES
	valorRetornoHilo=hilo_crear();

	//variables leer
	punteroFrenteLeer=NULL;
	punteroFinLeer=NULL;
	//variables escribir
	punteroFrenteEscribir = NULL;
	punteroFinEscribir = NULL;

	//variables sincronizacion
	ultimoLeido = 0;
	ultimoEscrito = 0;
	punteroFrenteSincro = NULL;
	punteroFinSincro = NULL;
	pthread_mutex_lock(&mutexSincro);
	sincronizador=0;
	pthread_mutex_unlock(&mutexSincro);

	//variables de finalizacion
	finalizar=0;
	while(1) {
		//CHEQUEO QUE NO HAYA QUE FINALIZAR
		pthread_mutex_lock(&mutexFinalizar);
		if(finalizar==1) {
			pthread_mutex_unlock(&mutexFinalizar);
			exit(0);
		}
		pthread_mutex_unlock(&mutexFinalizar);
		//EJECUTO LAS ESCRITURAS SI HAY PEDIDOS
		escribir_distribuir();
		//EJECUTO LAS LECTURAS SI HAY PEDIDOS
		lectura_distribuir();
		//EJECUTO LA SINCRONIZACION SI HAY PEDIDO
		pthread_mutex_lock(&mutexSincro);
		if (sincronizador==1) {
			sincronizar();
		}
		pthread_mutex_unlock(&mutexSincro);
	}
	//ESPERO A QUE FINALICE EL HILO
	pthread_join(hilito, NULL);
	//DESTRUYO LOS MUTEX CREADOS
	pthread_mutex_destroy(&mutexSincro);
	pthread_mutex_destroy(&mutexFinalizar);
	pthread_mutex_destroy(&mutexArchConfig);
	pthread_mutex_destroy(&mutexSecTot);
	pthread_mutex_destroy(&mutexPtroSelectAux);
	pthread_mutex_destroy(&mutexPtroFte);
	pthread_mutex_destroy(&mutexPtroFteEsc);
	pthread_mutex_destroy(&mutexPtroFteEscritura);
	pthread_mutex_destroy(&mutexDescriptor);
	pthread_mutex_destroy(&mutexPtroFteSelectAux);
	pthread_mutex_destroy(&mutexPtroFinEsc);
	return 0;
}
